package com.springmvc.handler;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;



import java.io.IOException;

@Controller
public class SpringmvcTest {


    /**
     * springmvc运行流程！！！重要，面试
     */
    /**
     * 异常处理之DefaultHandlerExceptionResolver
     * @return
     */
    @RequestMapping("/testDefaultHandlerExceptionResolver")
    public String testDefaultHandlerExceptionResolver(){
        return "success";
    }

    /**
     * 异常处理之ResponseStatusExceptionResolver
     * @param i
     * @return
     */
    @RequestMapping("/testResponseStatusExceptionResolver")
    public String testResponseStatusExceptionResolver(@RequestParam("i") Integer i){
        if(i==13){
            throw new UserNameNotMatchPasswordException();
        }
        System.out.println("testResponseStatusExceptionResolver");

        return "success";
    }
    /**
     * 实现springmvc的文件上传；步骤
     * 1.配置springmvc资源文件
     * 2.编写form标签
     * 3.编写目标方法
     * @param desc
     * @param file
     * @return
     * @throws IOException
     */

    @RequestMapping("/testFileUpload")
    public String testFileUpload(@RequestParam("desc") String desc, @RequestParam("file")MultipartFile file) throws IOException {
        //
        System.out.println("desc:"+desc);
        //文件原始的名字
        System.out.println("OriginalFilename" +file.getOriginalFilename());
        //文件对应的输入流
        System.out.println("InputStream:"+file.getInputStream());
        return "success";
    }


    /**
     * 异常处理
     * 1、在@ExceptionHandler的方法入参中可以加入Exception类型的参数，该参数即对应发生的异常对象
     * 2.如何将错误信息导入到页面上（一般的思路是使用map），但是这不能使用，要使用ModelAndView作为返回值
     * 3.多个@ExceptionHandler方法之间的优先级问题：谁离 问题目标方法 越近，谁的优先级越高
     * 4.如果发现该类中没有处理的目标方法，则会去@ControllerAdvice标记的类中去查找
     * @param ex
     * @return
     */
    @ExceptionHandler({ArithmeticException.class})
    public ModelAndView handlerArithmeticException(Exception ex){
        System.out.println("出异常了："+ex);
        ModelAndView mv=new ModelAndView("error");
        mv.addObject("exception",ex);
        return mv;
    }

    /**
     * 异常处理
     * @param id
     * @return
     */
    @RequestMapping("/testExceptionHandlerExcpetionResolver")
    public String testExceptionHandlerExcpetionResolver(@RequestParam("id") Integer id){

        System.out.println("result:"+(10/id));
        return "success";
    }
}
